#ifndef _CONNECTION_H
#define _CONNECTION_H

#include "../StdAfx.h"

class NetServer;

class Connection : public boost::enable_shared_from_this<Connection>,
		private boost::noncopyable
{
public:
	// Constructor
	explicit Connection(boost::asio::io_service& io_service);
	// Destructor
	~Connection();
	// Socket asociado a la conexion
	boost::asio::ip::tcp::socket& getSocket();
	// Direccion de la ultima conexion del socket
	boost::asio::ip::tcp::endpoint getEndPoint();
	// Comenzar la primera operacion asincrona de la conexion
	void start();
	// Cerrar la conexion
	void close();
private:
	// Callback de la lectura asincrona
	void handleRead(const boost::system::error_code& e,
			std::size_t bytes_transferred);
	// Callback de escritura asincrona
	void handleWrite(const boost::system::error_code& e);
	// Callback de errores del socket
	void handleError(const boost::system::error_code& e);
	// Close privado
	void close(bool remove);
	// Variables privadas
	NetServer* mNs;
	char mBuffer[1024];
	// Strand para evitar operaciones asincronas simultaneas
	boost::asio::io_service::strand mStrand;
	boost::asio::ip::tcp::socket mSocket;
	boost::asio::ip::tcp::endpoint mEndPoint;
	boost::mutex mMuxCon;
	bool isClosing;
};

typedef boost::shared_ptr<Connection> connection_ptr;

#endif
